package com.cetc.lambda.expt;

import com.cetc.lambda.Person;
import org.junit.Test;

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * @Classname LambdaPractice
 * @Description Lambda练习
 * @Date 2023/1/5 16:01
 * @Created by louzhuangxi
 */
public class LambdaPractice {
    List<Person> personList = Arrays.asList(
            new Person("张三", 24),
            new Person("李四", 80),
            new Person("王五", 28),
            new Person("赵六", 42),
            new Person("田七", 28)
    );

    /**
     * 调用 Collections.sort()方法，通过定制排序比较两个 Employee(先按年龄比，年龄相同按姓名比),
     * 使用 Lambda 表达式作为参数传递
     */
    @Test
    public void test01() {
        Collections.sort(personList, new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                if (o1.getAge() == o2.getAge()) {
                    return o1.getName().compareTo(o2.getName());
                }
                ;
                return Integer.compare(o1.getAge(), o2.getAge());
            }
        });
        for (Person person : personList) {
            System.out.println(person);
        }

        System.out.println("**********************");

        Collections.sort(personList, (o1, o2) -> {
            if (o1.getAge() == o2.getAge()) {
                return o1.getName().compareTo(o2.getName());
            }

            return Integer.compare(o1.getAge(), o2.getAge());
        });

        for (Person person : personList) {
            System.out.println(person);
        }
    }

    /**
     * ①声明一个带两个泛型的函数式接口，泛型类型为<T,R> : T 为参数，R 为返回值。
     * ②接口中声明对应抽象方法
     * ③在LambdaTest类中声明方法，使用接口作为参数，计算两个long型参数的和。
     * ④再计算两个long型参数的乘积
     */
    @Test
    public void test02() {
        System.out.println(caculate(1L, 2L, (t1, t2) -> String.valueOf(t1 + t2)));
        System.out.println(caculate(1L, 2L, (t1, t2) -> String.valueOf(t1 * t2)));
    }

    public String caculate(long t1, long t2, GenericLambda<Long, String> genericLambda) {
        return genericLambda.getValue(t1, t2);
    }
}

/**
 * ①声明函数式接口,接口中声明抽象方法：public String getValue(String str)
 * ②声明类LambdaTest，类中编写方法使用接口作为参数,将一个字符串转换成大写，并作为方法的返回值
 * ③再将一个字符串的第2个到第4个索引位置进行截取子串
 */
class LambdaTest {
    public static void main(String[] args) {
        StringOperate so = str -> str.toUpperCase();
        System.out.println(so.getValue("abc"));

        StringOperate so1 = str -> str.substring(1, 3);
        System.out.println(so1.getValue("abcdefg"));

        System.out.println("*****************************");

        String so2 = getValueF("abd", str -> str.toUpperCase());
        System.out.println(so2);

        String so3 = getValueF("ab1d1efg", str -> str.substring(1, 3));
        System.out.println(so3);
    }

    public static String getValueF(String str, StringOperate stringOperate) {
        return stringOperate.getValue(str);
    }
}